package cn.willcream.sfmg.part;

import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.TypeSpec;
import schemacrawler.schema.Column;
import schemacrawler.schema.Table;

import java.util.regex.Pattern;

public interface CodeGenPart {
    /**
     * 生成类相关的描述
     * @param t
     * @return
     */
    TypeSpec.Builder genClassSkeleton(Table t);

    /**
     * 生成每个字段
     * @param c
     * @return
     */
    FieldSpec genField(Column c);

    /**
     * 生成每个字段的Getter和Setter方法，如果使用Lombok，可以重写抽象类中genFieldAnnotation方法
     * @param c
     * @param builder
     */
    void genFieldGetterAndSetter(Column c, TypeSpec.Builder builder);

    /**
     * 为没有Guava等工具库的朋友准备的工具方法，全小写下划线转驼峰式命名
     * @param raw
     * @param isFirstUpper
     * @return
     */
    default String lowerUnderScoreToCamel(String raw, boolean isFirstUpper) {
        if (raw == null) {
            return null;
        }

        Pattern p = Pattern.compile("[a-z]+(_[a-z]*)*");
        if (!p.matcher(raw).matches()) {
            throw new IllegalArgumentException("传入的字符串不是全小写带下划线格式：" + raw);
        }

        // 分成数组
        char[] charArray = raw.toCharArray();
        // 判断上次循环的字符是否是"_"
        boolean underlineBefore = false;
        StringBuffer buffer = new StringBuffer();

        if (raw.length() < 1) {
            return raw;
        } else {
            if (isFirstUpper) {
                buffer.append(charArray[0] -= 32);
            } else
                buffer.append(charArray[0]);
        }

        for (int i = 1, l = charArray.length; i < l; i++) {
            // 判断当前字符是否是"_",如果跳出本次循环
            if (charArray[i] == '_') {
                underlineBefore = true;
            } else if (underlineBefore) {
                // 如果为true，代表上次的字符是"_",当前字符需要转成大写
                buffer.append(charArray[i] -= 32);
                underlineBefore = false;
            } else {
                // 不是"_"后的字符就直接追加
                buffer.append(charArray[i]);
            }
        }
        return buffer.toString();
    }
}
